10. ์Šคํƒ 3 (์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌํ˜„), ํ

8/5/2025

์Šคํƒ

์ด์ „ ์‹œ๊ฐ„์— ์ผ๋ฐ˜ ๋ฐฐ์—ด๊ณผ ๋™์  ๋ฐฐ์—ด๋กœ '์Šคํƒ'์ด๋ผ๋Š” ADT๋ฅผ ๊ตฌํ˜„ํ–ˆ๋‹ค.

๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋กœ ์Šคํƒ ๊ตฌํ˜„

push : ๋งจ ์•ž์— ํ•ญ๋ชฉ์„ ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.

  1. ์ƒˆ ๋…ธ๋“œ๋ฅผ ๋งŒ๋“ค๊ณ 
  2. head์˜ ํฌ์ธํ„ฐ์— ์žˆ๋Š” ์ฃผ์†Œ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ณ 
  3. ์ƒˆ ๋…ธ๋“œ์˜ ํฌ์ธํ„ฐ์— ๊ฐ€์ ธ์˜จ ์ฃผ์†Œ๊ฐ’์„ ๋„ฃ๊ณ 
  4. ์ž์‹ ์˜ ์ฃผ์†Œ๊ฐ’์„ head์—๊ฒŒ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•œ๋‹ค.

pop : ์ฒซ ๋…ธ๋“œ(header/top node)๋ฅผ ์‚ญ์ œํ•˜๋Š”๊ฒƒ์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.

  1. ์ž„์‹œ ๋…ธ๋“œ๋ฅผ ๋งŒ๋“ค๊ณ 
  2. head๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ๊ฐ’์„ ์ž„์‹œ ๋…ธ๋“œ์˜ ํฌ์ธํ„ฐ์— ํ• ๋‹น.
  3. ํƒ‘ ๋…ธ๋“œ์˜ ๊ฐ’๊ณผ ํƒ‘ ๋…ธ๋“œ์˜ ํฌ์ธํ„ฐ์— ์žˆ๋Š” ์ฃผ์†Œ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค.
  4. ํ—ค๋“œํฌ์ธํ„ฐ๋ฅผ ํƒ‘๋…ธ๋“œ์—์„œ ๊ฐ€์ ธ์˜จ ํฌ์ธํ„ฐ๋กœ ๋ฐ”๊พธ๊ณ 
  5. ์ž„์‹œ ๋…ธ๋“œ๊ฐ€ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ํƒ‘ ๋…ธ๋“œ์˜ ์ฃผ์†Œ๊ฐ’์„ free()ํ•ด์ฃผ๊ณ 
  6. 3๋ฒˆ์˜ ํƒ‘ ๋…ธ๋“œ ์•ˆ์— ์žˆ๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜.

์ „์ฒด ์‚ญ์ œ

์ด ๋ฐฉ๋ฒ•์€ ์‚ฌ์‹ค ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋™์ผํ•˜๋‹ค.
(์ €๋ฒˆ์‹œ๊ฐ„์— ๋…ธํŠธ๋ฅผ ์•ˆํ•ด์„œ ์—ฌ๊ธฐ๋‹ค๊ฐ€ ํ•จ)

  1. ์ž„์‹œ ํฌ์ธํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด ํƒ‘๋…ธ๋“œ์˜ ์ฃผ์†Œ๊ฐ’์„ ๊ฐ€์ ธ์™€ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•œ๋‹ค.
  2. ํ—ค๋“œํฌ์ธํ„ฐ๋ฅผ ๊ทธ ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•˜๊ณ 
  3. ์ž„์‹œ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด free()ํ•ด์„œ 1๋ฒˆ์—์„œ ๊ฐ€์ ธ์˜จ ํƒ‘๋…ธ๋“œ๋ฅผ ์ง€์šด๋‹ค
  4. ์ด ๊ณผ์ •์„ ํ—ค๋“œํฌ์ธํ„ฐ๊ฐ€ null์ผ๋•Œ ๊นŒ์ง€.
void clearStack(Node **head_ptr) {
    Node *head = *head_ptr; 
    Node *temp = NULL;
    
    while (head != NULL) {
        temp = head; 
        head = head->next; 
        free(temp);
    }
    
    *head_ptr = NULL; 
}

ํ

์Šคํƒ์ด๋ž‘์€ ๋ฐ˜๋Œ€๋กœ ๋จผ์ € ๋“ค์–ด๊ฐ„๊ฒƒ์ด ๋จผ์ € ๋‚˜์˜ค๋Š” ์ž๋ฃŒ๊ตฌ์กฐ.
FIFO - Fist In First Out.

push์™€ pop ๋Œ€์‹  EnQueue์™€ DeQueue๋ฅผ ์‚ฌ์šฉ.
push๊ฐ€ ๋งจ ์•ž์— ๋„ฃ๊ธฐ๋ผ๋ฉด, EnQueue๋Š” ๋งจ ๋’ค์— ๋„ฃ๊ธฐ.
pop๊ณผ DeQueue๋Š” ๋ชจ๋‘ ๋งจ ์•ž์—์„œ ์ œ๊ฑฐํ•˜๊ธฐ.

์–ด๋ ˆ์ด๋กœ ๊ตฌํ˜„

์›ํ˜•

์Šคํƒ์—์„œ๋Š” ๋“ค์–ด๊ฐ€๋Š” ์ชฝ๊ณผ ๊บผ๋‚ด๋Š” ์ชฝ์˜ ๋ฐฉํ–ฅ์ด ๋˜‘๊ฐ™๋‹ค.
ํ•˜์ง€๋งŒ ํ๋Š” ๋“ค์–ด๊ฐ€๋Š”๊ฑด ๋’ค์—์„œ ๋“ค์–ด๊ฐ€๊ณ , ๊บผ๋‚ผ๋•Œ๋Š” ์•ž์—์„œ ๊บผ๋‚ธ๋‹ค. ๋ฐฉํ–ฅ์ด ๋‹ค๋ฅด๋‹ค.
๊ทธ๋ž˜์„œ ์ผ๋ฐ˜ ์–ด๋ ˆ์ด๋กœ ํ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด, ๋ฐฐ์—ด์˜ ์•ž ๊ณต๊ฐ„์ด ๋‚ญ๋น„๋  ์ˆ˜ ์žˆ๋‹ค. ๊ธธ์ด 5์˜ ์–ด๋ ˆ์ด [1,2,3,4,5]์—์„œ 1๊ณผ 2๊ฐ€ ๋น ์ง€๋ฉด [ , ,3,4,5]๊ฐ€ ๋œ๋‹ค.
์ธํ๋Š” ๋’ค์—์„œ๋ถ€ํ„ฐ ๋„ฃ๊ธฐ๋•Œ๋ฌธ์—, ๋’ค์— ๊ณต๊ฐ„์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋”์ด์ƒ ๋„ฃ์„ ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค(์•ž์— ๋‘ ์ž๋ฆฌ๊ฐ€ ๋น„์–ด์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ ).

๊ทธ๋ž˜์„œ (๊ฐœ๋…์ ์œผ๋กœ)์„ ํ˜•์ด ์•„๋‹Œ ์›ํ˜•์ธ ์–ด๋ ˆ์ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์ด๊ฑธ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ front, rear ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ฒ˜์Œ์— ์–ด๋ ˆ์ด๋ฅผ ๋งŒ๋“ค๋•Œ front,rear ๋ชจ๋‘ -1์œผ๋กœ ํ• ๋‹นํ•œ๋‹ค. (๋น„์–ด์žˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด์„œ)

์ธํ

์›๋ฆฌ๋Š” ๊ฐ„๋‹จํ•˜๋‹ค. ํ•ญ์ƒ rear์˜ ์ˆœ์„œ์— ๊ฐ’์„ ๋„ฃ๋Š”๊ฒƒ.arr[rear] = var.

  1. ์ผ๋‹จ ํ๊ฐ€ ๊ฝ‰ ์ฐจ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. (๋ฐฉ๋ฒ•์€ ๋ฐ‘์—์„œ)
  2. rear = rear + 1 (๋ฐ‘์—์„œ ๋‹ค์‹œ ํ™•์ธ)
  3. arr[rear] ์ž๋ฆฌ์— ๊ฐ’์„ ์‚ฝ์ž…

๋””ํ

์ œ๊ฑฐํ• ๋•Œ๋Š” ๋ฐ˜๋Œ€๋กœ ํ•ญ์ƒ front์˜ ์ˆœ์„œ์—์„œ ๊ฐ’์„ ์ œ๊ฑฐํ•˜๋Š”๊ฒƒ.

  1. ์ผ๋‹จ ํ๊ฐ€ ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. (๋ฐฉ๋ฒ•์€ ๋ฐ‘์—์„œ)
  2. front = front +1; (๋ฐ‘์—์„œ ๋‹ค์‹œ ํ™•์ธ)
  3. arr[front]์— ์žˆ๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜.

ํ๊ฐ€ ๊ฝ‰ ์ฐจ์žˆ๋Š”์ง€, ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธ (๋ชจ๋“ˆ๋Ÿฌ)

๋ณดํ†ต์€ rear - front๋ฅผ ํ•˜๋ฉด ์–ด๋ ˆ์ด ์•ˆ์— ๋ช‡๊ฐœ์˜ ๊ฐ’์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜์žˆ๊ฒ ์ง€๋งŒ, ๋งŒ์•ฝ์— ํ•œ๋ฐ”ํ€ด ์ด์ƒ ๋Œ์•„๊ฐ€์„œ rear < front ์ธ ์ƒํ™ฉ์—์„  ์–ด๋–ป๊ฒŒ ํ• ๊นŒ?

[5, ,2,3,4] ๊ฝ‰ ์ฐจ์žˆ๋Š” ์ƒํ™ฉ์—์„œ rear๊ฐ€ 0์ด๊ณ  front๊ฐ€ 2์ด๋ผ๊ณ  ๊ฐ€์ •.
์ด์ œ ๋‹ค์Œ ์ฐจ๋ก€๋‹ˆ๊นŒ rear++๊ฐ€ ๋ผ์„œ rear๋Š” 1์ด ๋˜๊ณ , ์—ฌ๊ธฐ์— ์–ด๋ ˆ์ด์˜ ํฌ๊ธฐ์ธ 5๋ฅผ ๋”ํ•ด์„œ 6-2 = 4 ๋‹ˆ๊นŒ ๋น„์–ด์žˆ๋Š” ์ž๋ฆฌ๊ฐ€ ํ•˜๋‚˜ ์žˆ๋Š”๊ฑธ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰ rear % arr.length๋ฅผ ํ•ด์„œ ๊ฑฐ๊ธฐ์„œ front๋งŒํผ ๋นผ์ฃผ๋ฉด ๋˜๋Š”๊ฒƒ.
์ •๋ฆฌํ•˜์ž๋ฉด if((rear+1) % arr.length - front==0) ์˜ ์กฐ๊ฑด์ด ์ฐธ์ด๋ฉด ํ๊ฐ€ ๊ฝ‰ ์ฐจ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ ์‚ฌ์‹ค ์œ„์—์„œ ์ธํ๊ณผ ๋””ํ ๊ณผ์ •์—์„œ rear,front๋ฅผ ์ฆ๊ฐ€์‹œํ‚ฌ ๋•Œ ๋ชจ๋“ˆ๋Ÿฌ ๊ณ„์‚ฐ์„ ๋„ฃ์–ด์ค˜์•ผ ํ•œ๋‹ค.
rear = (rear + 1) % arr.length
front = (front + 1) % arr.length

๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธ์€ ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜?
๋น„์–ด์žˆ๋‹ค๋Š”๊ฑด front๊ฐ’(๋งˆ์ง€๋ง‰์œผ๋กœ ๋””ํํ•œ ํ›„์˜ ์ธ๋ฑ์Šค)์ด rear(๋งˆ์ง€๋ง‰์œผ๋กœ ์ธํํ•œ ํ›„์˜ ์ธ๋ฑ์Šค)๊ฐ€ ๊ฐ™๋‹ค๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.
๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธ์€ ๋””ํํ•˜๊ธฐ ์ „์— ํ•˜๋Š”๊ฒƒ์ด๋‹ˆ๊นŒ [ , , ,1, ]๋ฅผ ๋””ํํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.
๋งˆ์ง€๋ง‰ ์ธํํ•œ ํ›„์˜ rear๋Š” 3์ผ๊ฒƒ์ด๊ณ ,
๋งˆ์ง€๋ง‰ ๋””ํํ•œ ํ›„์˜ front๋Š” 2์ผ๊ฒƒ์ด๋‹ค.
rear != front์ด๋‹ˆ ๋””ํ ๊ณผ์ •์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
(front + 1 ) % 5๋ฅผ ํ•˜๋ฉด 3์ด ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  1์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์ œ๊ฑฐ.

์ด์ œ ๋‹ค์‹œ ๋˜ ๋””ํ๋ฅผ ์‹œ๋„ํ•ด๋ณด๋ฉด front == rear ๋ถˆ๊ฐ€๋Šฅํ•˜๊ณ  ์‹ค์ œ๋กœ ์–ด๋ ˆ์ด๋„ ๋น„์–ด์žˆ๋”ฐ.